#pragma once
#include <utl/vector.h>
#include <utl/deque.h>

namespace utl
{
	template<typename T>
	class tree_node
	{
	public:
		struct node_ref
		{
			T data;
			utl::vector<node_ref*> childs;
		};

		node_ref* get_base_node()
		{
			/*if(base_node == nullptr)
			{
				data_storage.emplace_back();
				base_node = &(data_storage.back());
			}*/
			return base_node;
		}

		void init_base_node()
		{
			base_node = create_node();
		}

		node_ref* create_node()
		{
			node_ref* temp_res{};
			if(free_datas.empty())
			{
				data_storage.emplace_back();
				temp_res = &(data_storage.back());
			}
			else
			{
				temp_res = free_datas.back();
				free_datas.pop_back();
			}
			return temp_res;
		}

	private:
		node_ref* base_node;
		utl::deque<node_ref> data_storage;
		utl::deque<node_ref*> free_datas;
	};
}